package com.tongyi.common.utils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.Map;

public class SignUtil {
    private static final String SECRET_KEY = "mld_666_hospital"; // 密钥
    private static final String HMAC_SHA256 = "HmacSHA256";

    /**
     * 生成签名
     * @param params 请求参数
     * @return 签名
     */
    public static String generateSign(Map<String, String> params) {
        // 按字典序排序
        String[] sortedKeys = params.keySet().toArray(new String[0]);
        Arrays.sort(sortedKeys);

        // 拼接参数
        StringBuilder paramStr = new StringBuilder();
        for (String key : sortedKeys) {
            paramStr.append(key).append(params.get(key));
        }

        // 拼接密钥
        paramStr.append(SECRET_KEY);

        // 生成签名
        return Base64.getEncoder().encodeToString(hmacSha256(paramStr.toString().getBytes(StandardCharsets.UTF_8), SECRET_KEY.getBytes(StandardCharsets.UTF_8)));
    }

    /**
     * 验证签名
     * @param params 请求参数
     * @param sign 请求中的签名
     * @return 签名是否有效
     */
    public static boolean verifySign(Map<String, String> params, String sign) {
        if (sign == null || sign.isEmpty()) {
            return false;
        }

        String generatedSign = generateSign(params);
        return generatedSign.equals(sign);
    }

    /**
     * 使用HmacSHA256算法生成签名
     * @param data 数据
     * @param key 密钥
     * @return 签名
     */
    private static byte[] hmacSha256(byte[] data, byte[] key) {
        try {
            Mac mac = Mac.getInstance(HMAC_SHA256);
            mac.init(new SecretKeySpec(key, HMAC_SHA256));
            return mac.doFinal(data);
        } catch (Exception e) {
            throw new RuntimeException("Failed to generate HMAC SHA256", e);
        }
    }

}
